package com.market.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.market.constants.ResultCode;
import com.market.entity.ProductCollect;
import com.market.exception.ServiceException;
import com.market.model.R;
import com.market.service.ProductCollectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 商品收藏控制器
 * 处理用户收藏商品相关的功能，包括添加收藏、取消收藏和获取收藏列表
 * 所有接口需要用户登录才能访问
 */
@RestController
@RequestMapping("/user/collect")
//@SaCheckLogin
public class ProductCollectController {
  @Autowired
  private ProductCollectService productCollectService;
  
  /**
   * 创建商品收藏记录
   * 如果用户已经收藏过该商品，则不重复创建
   * @param collect 包含商品ID的收藏信息对象
   * @return 操作结果
   */
  @PostMapping
  public R create(@RequestBody ProductCollect collect) {
    // 查询当前用户是否已经收藏过该商品
    ProductCollect one = productCollectService.lambdaQuery()
      .eq(ProductCollect::getUserId, StpUtil.getLoginIdAsString())
      .eq(ProductCollect::getProductId, collect.getProductId())
      .one();
    
    // 如果已经收藏过，直接返回成功
    if(!BeanUtil.isEmpty(one)) return R.ok();
    
    // 创建新的收藏记录对象
    ProductCollect productCollect = new ProductCollect();
    // 设置当前登录用户ID
    productCollect.setUserId(StpUtil.getLoginIdAsString());
    // 设置要收藏的商品ID
    productCollect.setProductId(collect.getProductId());
    // 设置创建时间
    productCollect.setCreateTime(new Date().getTime());
    // 设置更新时间
    productCollect.setUpdateTime(new Date().getTime());
    
    // 保存收藏记录到数据库
    boolean save = productCollectService.save(productCollect);
    // 如果保存失败，抛出服务异常
    if (!save) throw new ServiceException(ResultCode.SaveError);
    
    // 返回成功结果
    return R.ok();
  }
  @SaIgnore
  @PostMapping("/create")
  public R _create(@RequestBody ProductCollect collect) {
    System.out.println("收藏商品被调用");
    // 查询当前用户是否已经收藏过该商品
    ProductCollect one = productCollectService.lambdaQuery()
            .eq(ProductCollect::getUserId, collect.getUserId())
            .eq(ProductCollect::getProductId, collect.getProductId())
            .one();

    // 如果已经收藏过，直接返回成功
    if(!BeanUtil.isEmpty(one)) return R.ok();

    // 创建新的收藏记录对象
    ProductCollect productCollect = new ProductCollect();
    // 设置当前登录用户ID
    productCollect.setUserId(collect.getUserId());
    // 设置要收藏的商品ID
    productCollect.setProductId(collect.getProductId());
    // 设置创建时间
    productCollect.setCreateTime(new Date().getTime());
    // 设置更新时间
    productCollect.setUpdateTime(new Date().getTime());

    // 保存收藏记录到数据库
    boolean save = productCollectService.save(productCollect);
    // 如果保存失败，抛出服务异常
    if (!save) throw new ServiceException(ResultCode.SaveError);

    // 返回成功结果
    return R.ok();
  }
  
  /**
   * 取消收藏
   * 从当前用户的收藏列表中删除指定ID的收藏记录
   * @param id 收藏记录ID
   * @return 操作结果
   */
  @DeleteMapping("/{id}")
  public R delete(@PathVariable String id) {
    return productCollectService.delete(id);
  }

  @PostMapping("/delete/")
  public R _delete(@RequestBody ProductCollect productCollect) {
    return productCollectService._delete(productCollect);
  }
  
  /**
   * 获取当前用户的收藏商品ID列表
   * @return 返回收藏的商品ID列表
   */
  @GetMapping("/list")
  public R<List> list() {
    String userId = StpUtil.getLoginIdAsString();
    List<ProductCollect> list = productCollectService.lambdaQuery().eq(ProductCollect::getUserId, userId).list();
    ArrayList<Object> objects = new ArrayList<>();
    list.forEach(collect -> {
      objects.add(collect.getProductId());
    });
    return R.ok(objects);
  }
}
